package wh.两数之和;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * 给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target  的那 两个 整数，并返回它们的数组下标。
 * Arrays.toString该方法用于将数组对象转换为String类型，打印输出
 */
public class Solution {
    public static void main(String[] args) {
        //{}而不是[]
        int[] arr1 = {2,7,11,15,6,1};
       // int[] ints = twoSun(arr1, 8);
        int[] ints1 = twuSun2(arr1, 8);
        System.out.println(Arrays.toString(ints1));
       // System.out.println(Arrays.toString(ints));
    }


//暴力解法，时间复杂度为n的平方，不推荐
    public static int[] twoSun(int[] nums,int target){
        int length = nums.length;
        int[] nums2 = new int[2];
        for (int i = 0; i < length; i++) {
            for (int j = i + 1;j < length; j++){
                if(nums[i] + nums[j] == target){
                    nums2[0] = i;
                    nums2[1] = j;
                    return nums2;
                }
            }
        }
        return nums;
    }

    //hashmap解法！！时间复杂度为O（1）
    public static int[] twuSun2(int[] nums,int target){
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i< nums.length; i++) {
            //由于哈希查找的时间复杂度为 O(1)O(1)，所以可以利用哈希容器 map 降低时间复杂度
            if(map.containsKey(target - nums[i])) {
                return new int[] {map.get(target-nums[i]),i};
            }
            map.put(nums[i], i);
        }
        throw new IllegalArgumentException("No two sum solution");
    }






}
